package com.jml.装饰模式.五期.手写三级缓存.decorate.impl;

import com.jml.装饰模式.五期.手写三级缓存.decorate.ComponentCache;
import com.jml.装饰模式.五期.手写三级缓存.mapper.UserMapper;
import com.jml.装饰模式.五期.手写三级缓存.utils.JvmMapCacheUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


@Component
public class JvmComponentCache implements ComponentCache {

    @Autowired
    private UserMapper userMapper;

    @Override
    public <T> T getCacheEntity(String key, Class<T> t, ProceedingJoinPoint joinPoint) {
        // 先查询我们的一级缓存（Jvm内置）
        T jvmUser = JvmMapCacheUtils.getEntity(key,t);
        if (jvmUser != null) {
            return (T) jvmUser;
        }
        //查询我们的db 通过aop直接获取到我们的目标对象方法
        try {
            Object resultDb = joinPoint.proceed();
            // 数据库DB有的情况 将该内容缓存到当前Jvm中
            JvmMapCacheUtils.putEntity(key, resultDb);
            return (T) resultDb;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            return null;
        }
        // 版本声明来源每特教育蚂蚁课堂余胜军
    }
}
